/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package DAO;

import bean.Autor;
import bean.PDF;
import bean.Tema;
import bean.TrabalhoGestaoSocial;
import java.io.Serializable;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author fernando
 */
public class TrabalhoGSDAO implements Serializable {

    public TrabalhoGSDAO() {
        conexao = new ConexaoPostgres();
    }

    public boolean cadastrarTrabalhoGS(TrabalhoGestaoSocial trabalho) {
        boolean resultado = false;
        try {
            if (validarCadastroTrabalhoGS(trabalho)) {


                ps = conexao.getConnection().prepareStatement("INSERT INTO trabalho_gs(titulo, tipologia, objetivo_avaliacao, tipo_de_avaliacao, resumo, descricao_metodologia, outras_observacoes, link, onde_encontrar, pdf, instituicao_id) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?); ");
                ps.setString(1, trabalho.getTitulo());
                ps.setString(2, trabalho.getTipologia());
                ps.setString(3, trabalho.getObjetivoAvaliacao());
                ps.setString(4, trabalho.getTiposDeAvaliacao());
                ps.setString(5, trabalho.getResumo());
                ps.setString(6, trabalho.getDescricaoMetodologia());
                ps.setString(7, trabalho.getOutrasObservacoes());
                ps.setString(8, trabalho.getLink());
                ps.setString(9, trabalho.getTextoOndeEncontrar());
                if (trabalho.getPdf().getConteudo() != null) {
                    int idPdf = new PDFDao().cadastrarPDF(trabalho.getPdf());
                    ps.setInt(10, idPdf);
                } else {
                    ps.setNull(10, Types.NULL);
                }


                ps.setInt(11, trabalho.getInstituicao().getId());
                ps.executeUpdate();
                conexao.closeConnection();
                trabalho.setId(this.buscarIdTrabalhoGS(trabalho));

                Iterator i;

                if (!trabalho.getPalavrasChave().isEmpty()) {
                    i = trabalho.getPalavrasChave().iterator();

                    while (i.hasNext()) {
                        Tema t = (Tema) i.next();

                        ps = conexao.getConnection().prepareStatement("INSERT INTO trabalhogs_tema(trabalho_id, tema_id) VALUES (?, ?)");
                        ps.setInt(1, trabalho.getId());
                        ps.setInt(2, t.getId());
                        ps.executeUpdate();
                        conexao.closeConnection();
                    }
                }

                if (!trabalho.getAutores().isEmpty()) {
                    i = trabalho.getAutores().iterator();
                    int ordem = 1;
                    while (i.hasNext()) {
                        ps = conexao.getConnection().prepareStatement("INSERT INTO trabalhogs_autor (trabalho_id, autor_id, ordem) VALUES (?, ?, ?) ");

                        Autor a = (Autor) i.next();
                        ps.setInt(1, trabalho.getId());
                        ps.setInt(2, a.getId());
                        ps.setInt(3, ordem);
                        ordem++;
                        ps.executeUpdate();
                        conexao.closeConnection();

                    }
                }


                resultado = true;
            }

        } catch (SQLException ex) {
            Logger.getLogger(CursoDAO.class.getName()).log(Level.SEVERE, null, ex);
        }



        return resultado;
    }

    public int buscarIdTrabalhoGS(TrabalhoGestaoSocial trabalho) {
        int id = 0;
        try {

            ps = conexao.getConnection().prepareStatement("SELECT id FROM trabalho_gs WHERE titulo = ? AND tipologia = ? AND tipo_de_avaliacao = ? AND instituicao_id = ?");
            ps.setString(1, trabalho.getTitulo());
            ps.setString(2, trabalho.getTipologia());
            ps.setString(3, trabalho.getTiposDeAvaliacao());
            ps.setInt(4, trabalho.getInstituicao().getId());
            ResultSet rs = ps.executeQuery();
            conexao.closeConnection();
            while (rs.next()) {
                id = rs.getInt("id");

            }
        } catch (SQLException ex) {
            Logger.getLogger(CursoDAO.class.getName()).log(Level.SEVERE, null, ex);
        }

        return id;
    }

    public ArrayList<Autor> buscarAutores(int id) {
        ArrayList<Autor> autores = new ArrayList<Autor>();

        try {

            ps = conexao.getConnection().prepareStatement("SELECT autor_id FROM trabalhogs_autor WHERE trabalho_id = ? ORDER BY ordem");
            ps.setInt(1, id);
            ResultSet rs = ps.executeQuery();
            conexao.closeConnection();
            while (rs.next()) {
                int idAutor = rs.getInt("autor_id");
                autores.add(new AutorDao().consultaAutor(idAutor));


            }
        } catch (SQLException ex) {
            Logger.getLogger(CursoDAO.class.getName()).log(Level.SEVERE, null, ex);
        }


        return autores;

    }

    public ArrayList<Tema> buscarPalavrasChave(int id) {
        ArrayList<Tema> temas = new ArrayList<Tema>();

        try {

            ps = conexao.getConnection().prepareStatement("SELECT tema_id FROM trabalhogs_tema WHERE trabalho_id = ?");
            ps.setInt(1, id);
            ResultSet rs = ps.executeQuery();
            conexao.closeConnection();
            while (rs.next()) {
                int idTema = rs.getInt("tema_id");
                temas.add(new TemaDao().consultarTema(idTema));


            }
        } catch (SQLException ex) {
            Logger.getLogger(CursoDAO.class.getName()).log(Level.SEVERE, null, ex);
        }


        return temas;

    }

    public ArrayList<TrabalhoGestaoSocial> listarTrabalhosGS() {
        ArrayList<TrabalhoGestaoSocial> trabalhos = new ArrayList<TrabalhoGestaoSocial>();

        try {

            ps = conexao.getConnection().prepareStatement("SELECT id, titulo, tipologia, instituicao_id FROM trabalho_gs");
            ResultSet rs = ps.executeQuery();
            conexao.closeConnection();
            while (rs.next()) {
                TrabalhoGestaoSocial t = new TrabalhoGestaoSocial();
                t.setId(rs.getInt("id"));
                t.setTitulo((rs.getString("titulo")));
                t.setTipologia(rs.getString("tipologia"));
                t.setAutores(this.buscarAutores(t.getId()));
                t.setInstituicao(new InstituicaoDao().consultaInstituicao(rs.getInt("instituicao_id")));
                trabalhos.add(t);


            }
        } catch (SQLException ex) {
            Logger.getLogger(CursoDAO.class.getName()).log(Level.SEVERE, null, ex);
        }


        return trabalhos;

    }

    public boolean validarCadastroTrabalhoGS(TrabalhoGestaoSocial trabalho) {
        boolean retorno = false;
        try {
            ps = conexao.getConnection().prepareStatement("SELECT id FROM trabalho_gs WHERE titulo = ? AND tipologia = ? AND tipo_de_avaliacao = ? AND instituicao_id = ?");
            ps.setString(1, trabalho.getTitulo());
            ps.setString(2, trabalho.getTipologia());
            ps.setString(3, trabalho.getTiposDeAvaliacao());
            ps.setInt(4, trabalho.getInstituicao().getId());
            ResultSet rs = ps.executeQuery();
            conexao.closeConnection();
            if (rs.next()) {
                return retorno;
            } else {
                retorno = true;
            }
        } catch (SQLException ex) {
            Logger.getLogger(CursoDAO.class.getName()).log(Level.SEVERE, null, ex);
        }

        return retorno;
    }

    public TrabalhoGestaoSocial buscarTrabalho(int id) {
        TrabalhoGestaoSocial trabalho = new TrabalhoGestaoSocial();

        try {
            ps = conexao.getConnection().prepareStatement("SELECT titulo, tipologia, objetivo_avaliacao, tipo_de_avaliacao, resumo, descricao_metodologia, outras_observacoes, link, onde_encontrar, pdf, instituicao_id  FROM trabalho_gs WHERE id = ? ");
            ps.setInt(1, id);
            ResultSet rs = ps.executeQuery();
            conexao.closeConnection();
            if (rs.next()) {
                trabalho.setId(id);
                trabalho.setTitulo(rs.getString("titulo"));
                trabalho.setTipologia(rs.getString("tipologia"));
                trabalho.setObjetivoAvaliacao(rs.getString("objetivo_avaliacao"));
                trabalho.setTiposDeAvaliacao(rs.getString("tipo_de_avaliacao"));
                trabalho.setResumo(rs.getString("resumo"));
                trabalho.setDescricaoMetodologia(rs.getString("descricao_metodologia"));
                trabalho.setOutrasObservacoes(rs.getString("outras_observacoes"));
                trabalho.setLink(rs.getString("link"));
                trabalho.setTextoOndeEncontrar(rs.getString("onde_encontrar"));
                PDF pdf = new PDF();
                pdf.setId(rs.getInt("pdf"));
                trabalho.setPdf(pdf);
                trabalho.setInstituicao(new InstituicaoDao().consultaInstituicao(rs.getInt("instituicao_id")));
                trabalho.setAutores(this.buscarAutores(id));
                trabalho.setPalavrasChave(this.buscarPalavrasChave(id));
            }



        } catch (SQLException ex) {
            Logger.getLogger(CursoDAO.class.getName()).log(Level.SEVERE, null, ex);
        }

        return trabalho;
    }

    public int idPdfAntigo(int id) {
        int idAntigo = 0;
        try {
            ps = conexao.getConnection().prepareStatement("SELECT pdf FROM trabalho_gs WHERE id = ? ");
            ps.setInt(1, id);
            ResultSet rs = ps.executeQuery();
            conexao.closeConnection();
            if (rs.next()) {

                idAntigo = rs.getInt("pdf");

            }

        } catch (SQLException ex) {
            Logger.getLogger(CursoDAO.class.getName()).log(Level.SEVERE, null, ex);
        }



        return idAntigo;
    }

    public boolean alterarTrabalho(TrabalhoGestaoSocial trabalho) {
        boolean resultado = false;

        try {
            ps = conexao.getConnection().prepareStatement("UPDATE trabalho_gs SET titulo = ?, tipologia = ?, objetivo_avaliacao = ?, tipo_de_avaliacao = ?, resumo = ?, descricao_metodologia = ?, outras_observacoes = ?, link = ?, onde_encontrar = ?, pdf = ?, instituicao_id = ? WHERE id = ? ");
            ps.setString(1, trabalho.getTitulo());
            ps.setString(2, trabalho.getTipologia());
            ps.setString(3, trabalho.getObjetivoAvaliacao());
            ps.setString(4, trabalho.getTiposDeAvaliacao());
            ps.setString(5, trabalho.getResumo());
            ps.setString(6, trabalho.getDescricaoMetodologia());
            ps.setString(7, trabalho.getOutrasObservacoes());
            ps.setString(8, trabalho.getLink());
            ps.setString(9, trabalho.getTextoOndeEncontrar());
            if ( trabalho.getId() == 0 && !trabalho.getPdf().getNome().isEmpty()) {
                int idPdfAntigo = this.idPdfAntigo(trabalho.getId());
                if (idPdfAntigo > 0) {
                    new PDFDao().removerPDF(idPdfAntigo);
                }
                int idPdf = new PDFDao().cadastrarPDF(trabalho.getPdf());
                ps.setInt(10, idPdf);
            } else if(trabalho.getPdf().getId() != 0) {
                ps.setInt(10, trabalho.getPdf().getId());
            }else{
                ps.setNull(10, Types.NULL);
                
            }
            ps.setInt(11, trabalho.getInstituicao().getId());
            ps.setInt(12, trabalho.getId());
            ps.executeUpdate();
            conexao.closeConnection();

            ps = conexao.getConnection().prepareStatement("DELETE FROM trabalhogs_tema WHERE trabalho_id = ? ");
            ps.setInt(1, trabalho.getId());
            ps.executeUpdate();
            conexao.closeConnection();

            Iterator i;

            if (!trabalho.getPalavrasChave().isEmpty()) {
                i = trabalho.getPalavrasChave().iterator();

                while (i.hasNext()) {
                    Tema t = (Tema) i.next();

                    ps = conexao.getConnection().prepareStatement("INSERT INTO trabalhogs_tema(trabalho_id, tema_id) VALUES (?, ?)");
                    ps.setInt(1, trabalho.getId());
                    ps.setInt(2, t.getId());
                    ps.executeUpdate();
                    conexao.closeConnection();
                }
            }

            ps = conexao.getConnection().prepareStatement("DELETE FROM trabalhogs_autor WHERE trabalho_id = ? ");
            ps.setInt(1, trabalho.getId());
            ps.executeUpdate();
            conexao.closeConnection();

            if (!trabalho.getAutores().isEmpty()) {
                i = trabalho.getAutores().iterator();
                int ordem = 1;
                while (i.hasNext()) {
                    ps = conexao.getConnection().prepareStatement("INSERT INTO trabalhogs_autor (trabalho_id, autor_id, ordem) VALUES (?, ?, ?) ");

                    Autor a = (Autor) i.next();
                    ps.setInt(1, trabalho.getId());
                    ps.setInt(2, a.getId());
                    ps.setInt(3, ordem);
                    ordem++;
                    ps.executeUpdate();
                    conexao.closeConnection();

                }
            }


            resultado = true;





            resultado = true;
        } catch (SQLException ex) {
            Logger.getLogger(CursoDAO.class.getName()).log(Level.SEVERE, null, ex);
        }

        return resultado;
    }
    private Conexao conexao;
    private PreparedStatement ps;
    private boolean sucess = false;
}
